package A一周刷爆LeetCode.A基础班.C认识NlogN的排序;

import A一周刷爆LeetCode.A基础班.B认识复杂度和简单排序算法.Sort;

import java.util.Objects;

/**
 * @author wei.zhao
 * @description: 快排2.0版本
 * @date 2022年01月14日 10:51
 */
public class Code07_QuickSort02 extends Sort {

    @Override
    public void sort(int[] arr) {
        if (Objects.isNull(arr) || arr.length < 2) {
            return;
        }
        quickSort(arr, 0, arr.length-1);
    }

    private void quickSort(int[] arr, int l, int r) {
        if (l == r) {
            return;
        }
        int[] border = partition(arr, l, r);
        //左边快排
        if (border[0] > l) {
            quickSort(arr, l, border[0] - 1);
        }
        //右边快排
        if (border[1] < r) {
            quickSort(arr, border[1] + 1, r);
        }
    }

    private int[] partition(int[] arr, int l, int r) {
        int[] result = new int[2];
        int temp = arr[r];
        int lp = l;
        int rp = r;
        for (int i = l; i <= r; i++) {
            if (i > rp) {
                break;
            }
            if (arr[i] < temp) {
                swap(arr, i, lp++);
            } else if (arr[i] > temp) {
                swap(arr, i--, rp--);
            }
        }
        result[0] = lp;
        result[1] = rp;
        return result;
    }

}
